<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/9/1
 * Time: 15:03
 */
//使用curl_multi的步骤总结如下：
//
//第一步：调用curl_multi_init
//第二步：循环调用curl_multi_add_handle
//这一步需要注意的是，curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
//第三步：持续调用curl_multi_exec
//第四步：根据需要循环调用curl_multi_getcontent获取结果
//第五步：调用curl_multi_remove_handle，并为每个字handle调用curl_close
//第六步：调用curl_multi_close
//
//各函数作用解释：
//
//curl_multi_init()
//初始化一个curl批处理句柄资源。
//
//curl_multi_add_handle()
//向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数，第一个参数表示一个curl批处理句柄资源，第二个参数表示一个单独的curl句柄资源。
//
//curl_multi_exec()
//解析一个curl批处理句柄，curl_multi_exec()函数有两个参数，第一个参数表示一个批处理句柄资源，第二个参数是一个引用值的参数，表示剩余需要处理的单个的curl句柄资源数量。
//
//curl_multi_remove_handle()
//移除curl批处理句柄资源中的某个句柄资源，curl_multi_remove_handle()函数有两个参数，第一个参数表示一个curl批处理句柄资源，第二个参数表示一个单独的curl句柄资源。
//
//curl_multi_close()
//关闭一个批处理句柄资源。
//
//curl_multi_getcontent()
//在设置了CURLOPT_RETURNTRANSFER的情况下，返回获取的输出的文本流。
//
//curl_multi_info_read()
//获取当前解析的curl的相关传输信息。
function async_get_url($array_url, $wait_usec = 0)
{
    if (!is_array($array_url)) return false;
    $wait_usec = (int)$wait_usec;
    $data = array();
    $handle = array();
    $running = 0;
    $mh = curl_multi_init();//初始化一个curl批处理句柄资源。
    $i = 0;
    foreach ($array_url as $url) {
        $ch = curl_init();
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //  //不显示网页内容
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
        curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
        curl_multi_add_handle($mh, $ch);//把curl resource放到muilt_curl_handler里
        $handle[$i++] = $ch;
    }
    //执行
    do {
        curl_multi_exec($mh, $running);
        if ($wait_usec > 0) usleep($wait_usec);//每个connect需要间隔多久
    } while ($running > 0);

    //获取请求返回的数据
    foreach ($handle as $i => $ch) {
        $content = curl_multi_getcontent($ch);
        $data[$i] = (curl_errno($ch) == 0) ? $content : false;
    }
    //移除handle
    foreach ($handle as $ch) {
        curl_multi_remove_handle($mh, $ch);
    }
    //关闭批处理句柄
    curl_multi_close($mh);
    return $data;

}
$arr=array(
    'www.baibu.com',
    'www.baibu.com',
    'www.baibu.com',
    'www.baibu.com',
    'www.baibu.com',
    'www.baibu.com',
);
async_get_url($arr);
//var_dump(async_get_url($arr));
echo '</br>';